
import java.util.Scanner;

/**
 * 万年历分析
 * 	 核心：1900年1月1日为星期一，星期一前面还有一个星期日。
 * 	 例如：输入的年为：2019年，月为：11月，那么我们想要得到2019年11月1日为星期几，那么就需要得到
 * 	    [1900年1月, 2019年10月]之间的总天数，拿到总天数就能计算出2019年11月1日前面有几个空格。
 *  总天数：先获得年的总天数，然后再获取月的总天数
 *  	 --> 年的总天数：[1900年, 2018年]之间的总天数
 *  	 --> 月的总天数：[2019年1月, 2019年10月]之间的总天数
 * 实现步骤：
 * 	 a)通过Scanner获得年（year）和月（month）
 * 	 b)获得[1900年1月，year年month月)之间的总天数
 * 		--> 年的总天数：[1900年, year年)之间的总天数
 *      --> 月的总天数：[year年1月, year年month月)之间的总天数
 *   c)获得year年month月有多少天
 *   d)对year年month月的日历进行布局
 *   	--> year年month月1日为星期几，通过“第二步”来实现
 *   	--> year年month月有多少天，我们可以通过“第三步”来实现
 */
public class CalendarTest02 {
	/**
	 * 获得[1900年, year年)之间的总天数
	 * @param year 
	 * @return 返回[1900年, year年)之间的总天数
	 */
	public static int getYearDays(int year) {
		// 保存年的总天数
		int yearDays = 0;
		// 获得[1900年, year年)之间的总天数
		for (int i = 1900; i < year; i++) {
			// 判断i是闰年还是平年
			yearDays += isRunYear(i) ? 366 : 365;
		}
		// 返回总天数
		return yearDays;
	}
	
	/**
	 * 获得[year年1月, year年month月)之间的总天数
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getMonthDays(int year, int month) {
		// 保存月的总天数
		int monthDays = 0;
		// 计算[year年1月, year年month月)之间的总天数
		for(int i = 1; i < month; i++) {
			// 判断year年i月有多少天
			monthDays += getMonthDay(year, i);
		}	
		// 返回月的总天数
		return monthDays;
	}
	
	/**
	 * 获得year年month月有多少天
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getMonthDay(int year, int month) {
		// 判断year年month月为几月，从而计算出year年month月有多少天
		switch (month) {
			case 1:case 3:case 5:case 7:case 8:case 10:case 12:
				return 31;
			case 4: case 6:case 9:case 11:	
				return 30;
			case 2:
				if(isRunYear(year)) {
					return 29;
				}
				else {
					return 28;
				}
			default:
				// 月份输入有误，请重新输入！
				return -1;
		}
	}
	
	/**
	 * 获得[1900年1月，year年month月)之间的总天数
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getAllDays(int year, int month) {
		// 1.获得[1900年, year年)之间的总天数
		int yearDays = getYearDays(year);
		// 2.获得[year年1月, year年month月)之间的总天数
		int monthDays = getMonthDays(year, month);
		// 3.返回总天数
		return yearDays + monthDays;
	}
	
	/**
	 * 对year年month月的日历进行布局
	 * @param allDays
	 * @param monthDay
	 */
	public static void layoutView(int allDays, int monthDay) {
		// 4.0输出星期一到星期日
		System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");
		// 4.1获取year年month月1日前面有几个空格（假设输入的为：1900年2月）
		int temp = (allDays + 1) % 7;
		// 4.2打印空格数
		for(int i = 0; i < temp; i++) {
			System.out.print("\t");
		}
		// 4.3打印year年month月的日历
		for(int i = 1; i <= monthDay; i++) {
			System.out.print(i + "\t");
			// 当temp+i的值为7的倍数时，执行换行操作
			if((temp + i) % 7 == 0) {
				System.out.println();
			}
		}
	}
	
	/**
	 * 判断year年是否为闰年
	 * @param year
	 * @return 闰年则返回true，平年则返回false
	 */
	public static boolean isRunYear(int year) {
		return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
	}
	
	public static void main(String[] args) {
		// 1.通过Scanner获得年（year）和月（month）
		Scanner input = new Scanner(System.in);
		System.out.print("请输入年：");
		int year = input.nextInt();
		System.out.print("请输入月：");
		int month = input.nextInt();
		
		// 2.获得[1900年1月，year年month月)之间的总天数
		int allDays = getAllDays(year, month);
		
		// 3.获得year年month月有多少天
		int monthDay = getMonthDay(year, month);
		 
		// 4.对year年month月的日历进行布局
		layoutView(allDays, monthDay);
	}
}
